package com.example.demo.controller;

import com.example.demo.bean.User;
import com.example.demo.bean.UserInfo;
import com.example.demo.dao.UserMapper;
import com.example.demo.service.MailService;
import com.example.demo.utils.RedisUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
@CrossOrigin
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private RedisUtils redisUtils;
    /*
    * 登录,先判断缓存有没有此人，没有的话再查数据库，同时要防击穿
    * */
    @RequestMapping("/login")
    @ResponseBody
    public String loginBypw(@RequestBody UserInfo userInfo){
        String code=userInfo.getCode();
        // String beforecode= (String) session.getAttribute("code");
        String beforecode= (String) redisUtils.get("code");        //取redis
        if(code.equals(beforecode)){                                //判断验证码是否正确
            User user=userInfo.toUser();                           //取user
            //登录加缓存逻辑
            if(redisUtils.hasKey("user_"+user.getUsername())){            //判断缓存是否有
                User user2= (User) redisUtils.get("user_"+user.getUsername());
                if(user.getPassword().equals(user2.getPassword())){     //判断缓存里的密码和输入的密码是否一样
                    return "通过缓存登录成功!";
                }else{
                    return "与缓存内的信息不符合!";
                }
            }else {
                User user1 = userMapper.login(user);
                if (user1 != null) {                                //判断数据库是否有此人信息
                    redisUtils.set("user_"+user1.getUsername(),user1);            //此信息存入缓存
                    return "通过数据库登录成功!";
                } else {
                    user.setPassword("errorlogin");        //处理不符合数据库的数据，防止缓存击穿!
                    redisUtils.set("user_"+user.getUsername(),user); //user1不存在，所以存user
                    return "与数据库信息不符合!";
                }
            }


        }else{
            return "验证码错误!";
        }
    }
    /*
     * 注册见mailcontroller
     * */

    /*
    * 检验用户名是否存在!这里最好先在缓存里查看，缓存没有再找数据库，同时也要防击穿!但是考虑到如果登录的时候有人进行了错误登录
    * 并在缓存记录了，那么这条信息就会被误判，所以还要做好区别
    * */
    @RequestMapping("/checkusername")
    @ResponseBody
    public String checkusername(String username){
        boolean flag=redisUtils.hasKey("user_"+username);
        if(flag){
            User user= (User) redisUtils.get("user_"+username);      //如果缓存在并把user取出来
            if(!user.getPassword().equals("errorlogin")){             //判断是不是login的错误数据(后续用方法定时遍历清除!)
                return "用户名已存在(缓存)!";                            //如果不是错误数据，那就是存在用户名
            }else{                                                    //如果是错误数据就去数据库查
                return checkusernamebysql(username);
            }
        }else {                                                      //如果缓存没有那就去数据库
           return checkusernamebysql(username);
        }

    }
    /*
    * 通过数据库查询用户名是否存在，供总主方法使用
    * */
    public String checkusernamebysql(String username){
        User user=userMapper.checkusername(username);
        if(user!=null){
            return "用户名已存在(数据库)!";
        }else{
            return "用户名可用!";
        }
    }
    /*
    * 读取用户头像，和查用户名是否存在一样的逻辑,可以用checkusername的函数，相对于根据用户名查用户
    * */
    @RequestMapping("/getimagebyname")
    @ResponseBody
    public String getimagebyname(String username){
        boolean flag=redisUtils.hasKey("user_"+username);
        if(flag){
            User user= (User) redisUtils.get("user_"+username);      //如果缓存在并把user取出来
            if(!user.getPassword().equals("errorlogin")){             //判断是不是login的错误数据(后续用方法定时遍历清除!)
                String imageurl=user.getImgurl();
                return imageurl;                                       //如果不是错误数据，那就是存在用户,把用户的头像返回出来
            }else{                                                    //如果是错误数据就去数据库查头像
                return getimagenamebysql(username);
            }
        }else{
            return getimagenamebysql(username);                    //如果缓存没有那就去数据库头像
        }
    }
    /*
     * 通过数据库查询url，供总主方法使用
     * */
    public String getimagenamebysql(String username){
        User user=userMapper.checkusername(username);
        if(user!=null){
            return user.getImgurl();
        }else{
            return "http://localhost:9090/images/error.png";
        }
    }
    /*
    * 查询用户的信息,先在缓存查，缓存没有的话去数据库，注意的是，修改的数据一定要在缓存里删掉!
    * */
    @RequestMapping("/queryUserbyUsername")
    @ResponseBody
    public User queryUser(String username){
        boolean flag=redisUtils.hasKey("user_"+username);
        if(flag){
            User user= (User) redisUtils.get("user_"+username);            //如果缓存有就把缓存里的user拿出来
            return user;
        }else{                                                             //没有就去数据库
            User user2=userMapper.checkusername(username);
            return user2;
        }
    }

}
